#include <stdio.h>/*该文件包含printf()等函数*/
#include <stdlib.h>/*该文件包含exit()等函数*/
#include <malloc.h>/*该文件包含malloc()等函数*/



#define true 1
#define false 0
typedef int DataType;

typedef struct Node
{
    DataType data;
    struct Node *next;
}SLNode;

int ListInitiate(SLNode **head)/*链表初始化*/ {
    *head=(SLNode *)malloc(sizeof(SLNode));
    (*head)->next=NULL;

    return 0;
}

int ListLength(SLNode *head) {
    int num=0;
    SLNode *p=head;
    while(p->next!=NULL){
        p=p->next;
        num++;
    }
    return num;


}

//第二部分李诗雨
int ListInsert(SLNode *head, int i, DataType x) {
    SLNode *p = head;
    int j = -1;

    while (p->next != NULL && j < i-1){
        p = p->next;
        j++;
    }
    if(j != i-1){
        printf("插入的位置参数错误");
        return 0;
    }
    SLNode *q = (SLNode *)malloc(sizeof(SLNode));
    q->data = x;

    q->next = p->next;
    p->next = q;
    return 1;
}//第二部分李诗雨


//第三部分解云菲
    int ListDelete(SLNode *head, int i, DataType *x) {
    SLNode *p,*s;
    int j;
    p=head;
    j=-1;
    while(p->next!=NULL &&p->next->next !=NULL && j<i-1)
    {
        p=p->next;
        j++;
    }

    if(j!=i-1)
    {
        printf("删除位置参数错！");
        return 0;
    }

    s=p->next;
    *x=s->data;
    p->next=p->next->next;
    free(s);


    return 1;
}//第三部分解云菲


//杨光富
int ListGet(SLNode *head, int i, DataType *x) {
    SLNode *p;
    int j;

    p=head;
    j=-1;
    while(p->next !=NULL &&j <i)
    {
        p=p->next;
        j++;
    }

    if(j!=i)
    {
        printf("取元素位置错！");
        return 0;
    }
    *x=p->data;



    return 1;
}

//杨光富



//第五段扶大宇2019240047
int Destroy(SLNode **head)
{
    SLNode *p, *p1;

    p=*head;
    while(p!= NULL)
    {
        p1=p;
        p=p->next;
        free(p1);
    }
    *head=NULL;
    return 1;
}

int	 main(void	) {
    SLNode *head;
    int i , x;
    ListInitiate(&head);
    for(i = 0; i < 10; i++) {
        if(ListInsert(head, i, i+1) == 0) /*插入10个数据元素*/
        {
            printf("错误! \n");
            return 0;
        }
    }

    if(ListDelete(head, 4, &x) == 0) { /*删除数据元素5*/
        printf("错误! \n");
        return 0;
    }
    printf("%d\n", ListLength(head));

    for(i = 0; i < ListLength(head); i++) {
        if(ListGet(head, i, &x) == 0) /*取元素*/
        {
            printf("错误! \n");
            return 0;
        }
        else printf("%d    ", x);/*显示数据元素*/
    }

    Destroy(&head);
}
//第五段扶大宇2019240047

